package service

import (
	"gin_gorm_oj/define"
	"gin_gorm_oj/helper"
	"gin_gorm_oj/models"
	"github.com/gin-gonic/gin"
	"log"
	"net/http"
	"strconv"
)

// GetCategoryList
// @Tags 管理员私有方法
// @Summary 分类列表
// @Param authorization header string true "authorization token"
// @Param page query int false "页码"
// @Param size query int false "每页大小"
// @Param keyword query string false "关键词"
// @Success 200 {string} json {"code":"200","data":""}
// @Router /admin/category-list [get]
func GetCategoryList(c *gin.Context) {
	// 获取分页参数
	size, _ := strconv.Atoi(c.DefaultQuery("size", define.DefaultSize))
	page, err := strconv.Atoi(c.DefaultQuery("page", define.DefaultPage))
	if err != nil {
		log.Println("GetCategoryList Page strconv Error:", err)
		return
	}
	page = (page - 1) * size
	keyword := c.Query("keyword")
	var data []*models.Category
	var count int64

	// 查询分类列表
	err = models.DB.Model(&models.Category{}).Where("name like ?", "%"+keyword+"%").
		Count(&count).Offset(page).Limit(size).Find(&data).Error
	if err != nil {
		log.Println("Get Category List Error:", err)
		c.JSON(http.StatusOK, gin.H{
			"code": -1,
			"msg":  "获取分类失败",
		})
		return
	}

	// 返回结果
	c.JSON(http.StatusOK, gin.H{
		"code": 200,
		"data": map[string]interface{}{
			"data":  data,
			"count": count,
		},
	})
}

// CategoryCreate
// @Tags 管理员私有方法
// @Summary 分类创建
// @Param authorization header string true "authorization"
// @Param name formData string true "name"
// @Param parentId formData int false "parentId"
// @Success 200 {string} json {"code":"200","data":""}
// @Router /admin/category-create [post]
func CategoryCreate(c *gin.Context) {
	// 获取表单参数
	name := c.PostForm("name")
	parentId, _ := strconv.Atoi(c.PostForm("parentId"))

	// 创建分类
	category := &models.Category{
		Identity: helper.GetUUID(),
		Name:     name,
		ParentId: parentId,
	}

	// 保存到数据库
	err := models.DB.Create(category).Error
	if err != nil {
		log.Println("CategoryCreate Error:", err)
		c.JSON(http.StatusOK, gin.H{
			"code": -1,
			"msg":  "创建分类失败",
		})
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "创建成功",
	})
}

// CategoryModify
// @Tags 管理员私有方法
// @Summary 分类修改
// @Param authorization header string true "authorization"
// @Param identity formData string true "identity"
// @Param name formData string true "name"
// @Param parentId formData int false "parentId"
// @Success 200 {string} json {"code":"200","data":""}
// @Router /admin/category-modify [put]
func CategoryModify(c *gin.Context) {
	// 获取表单参数
	identity := c.PostForm("identity")
	name := c.PostForm("name")
	parentId, _ := strconv.Atoi(c.PostForm("parentId"))

	// 参数校验
	if name == "" || identity == "" {
		c.JSON(http.StatusOK, gin.H{
			"code": -1,
			"msg":  "参数错误",
		})
		return
	}

	// 构建更新对象
	category := &models.Category{
		Identity: identity,
		Name:     name,
		ParentId: parentId,
	}

	// 修正更新模型
	err := models.DB.Model(&models.Category{}).Where("identity = ?", identity).
		Updates(category).Error

	if err != nil {
		log.Println("CategoryModify Error:", err)
		c.JSON(http.StatusOK, gin.H{
			"code": -1,
			"msg":  "修改分类失败",
		})
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "修改成功",
	})
}

// CategoryDelete
// @Tags 管理员私有方法
// @Summary 分类删除
// @Param authorization header string true "authorization"
// @Param identity query string true "identity"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /admin/category-delete [delete]
func CategoryDelete(c *gin.Context) {
	// 获取参数
	identity := c.Query("identity")

	// 参数校验
	if identity == "" {
		c.JSON(http.StatusOK, gin.H{
			"code": -1,
			"msg":  "参数不正确",
		})
		return
	}

	// 检查是否关联问题
	var cnt int64
	err := models.DB.Model(&models.ProblemCategory{}).
		Where("category_id = (SELECT id FROM category WHERE identity = ? LIMIT 1)", identity).
		Count(&cnt).Error
	if err != nil {
		log.Println("Get ProblemCategory Error:", err)
		c.JSON(http.StatusOK, gin.H{
			"code": -1,
			"msg":  "获取关联问题失败",
		})
		return
	}
	if cnt > 0 {
		c.JSON(http.StatusOK, gin.H{
			"code": -1,
			"msg":  "该分类下已存在问题，不可删除",
		})
		return
	}

	// 删除分类
	err = models.DB.Where("identity = ?", identity).Delete(&models.Category{}).Error
	if err != nil {
		log.Println("Delete Category Error:", err)
		c.JSON(http.StatusOK, gin.H{
			"code": -1,
			"msg":  "删除失败",
		})
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "删除成功",
	})
}
